package org.smart4j.framework.helper;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import org.smart4j.framework.util.ReflectUtil;

/**
 * description: Bean 助手类。 <br>
 *  1. 用于存放 ClassHelper 类获取的 Class对象。 再由 ReflectUtil 类的 newInstanse 方法创建对象。 <br>
 *  2. 避免频繁获取，造成资源浪费。 使用一个静态map进行存储
 * @version v1.0
 * @author w
 * @date 2018年8月28日下午10:45:11
 */
public final class BeanHelper {
	@SuppressWarnings("unused")
	private static final BeanHelper helper = new BeanHelper();
	
	/**
	 * Class : 类的 class 对象
	 * Object : 类的实例。
	 */
	private static final Map<Class<?>,Object> BEAN_MAP = new HashMap<Class<?>, Object>();
	
	static{
		Set<Class<?>> beanClassSet = ClassHelper.getBeanClassSet();
		for (Class<?> clzz : beanClassSet) {
			Object instanse = ReflectUtil.newInstanse(clzz);
			BEAN_MAP.put(clzz, instanse);
		}
	}
	
	/**
	 * description: 获取 Bean map 映射
	 * @return
	 * Map<Class<?>,Object>
	 * @version v1.0
	 * @author w
	 * @date 2018年8月28日 下午10:51:27
	 */
	public static Map<Class<?>,Object> getBeanMap(){
		return BEAN_MAP;
	}
	
	/**
	 * description: 获取 Bean 实例 （对象）
	 * @param clzz
	 * @return
	 * T
	 * @version v1.0
	 * @author w
	 * @date 2018年8月28日 下午10:56:16
	 */
	@SuppressWarnings("unchecked")
	public static <T> T getBean(Class<T> clzz){
		if(!BEAN_MAP.containsKey(clzz)){
			throw new RuntimeException("cloud not found object by class :" + clzz);
		}
		return (T) BEAN_MAP.get(clzz);
	}
	
	/**
	 * description: 添加 Bean 实例 
	 * @param cls
	 * @param obj
	 * void 
	 * @version v1.0
	 * @author w
	 * @date 2018年9月27日 下午5:29:39
	 */
	public static void setBean(Class<?> cls,Object obj){
		BEAN_MAP.put(cls,obj);
	}
	
}
